package cn.iocoder.yudao.module.mini.service.opinion;

import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import cn.iocoder.yudao.module.mini.controller.admin.opinion.vo.*;
import cn.iocoder.yudao.module.mini.dal.dataobject.opinion.OpinionDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

import cn.iocoder.yudao.module.mini.convert.opinion.OpinionConvert;
import cn.iocoder.yudao.module.mini.dal.mysql.opinion.OpinionMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mini.enums.ErrorCodeConstants.*;

/**
 * 意见反馈 Service 实现类
 *
 * @author dzy
 */
@Service
@Validated
public class OpinionServiceImpl implements OpinionService {

    @Resource
    private OpinionMapper opinionMapper;

    @Override
    public Long createOpinion(OpinionCreateReqVO createReqVO) {
        // 插入
        OpinionDO opinion = OpinionConvert.INSTANCE.convert(createReqVO);
        opinionMapper.insert(opinion);
        // 返回
        return opinion.getId();
    }

    @Override
    public void updateOpinion(OpinionUpdateReqVO updateReqVO) {
        // 校验存在
        validateOpinionExists(updateReqVO.getId());
        // 更新
        OpinionDO updateObj = OpinionConvert.INSTANCE.convert(updateReqVO);
        opinionMapper.updateById(updateObj);
    }

    @Override
    public void deleteOpinion(Long id) {
        // 校验存在
        validateOpinionExists(id);
        // 删除
        opinionMapper.deleteById(id);
    }

    private void validateOpinionExists(Long id) {
        if (opinionMapper.selectById(id) == null) {
            throw exception(OPINION_NOT_EXISTS);
        }
    }

    @Override
    public OpinionDO getOpinion(Long id) {
        return opinionMapper.selectById(id);
    }

    @Override
    public List<OpinionDO> getOpinionList(Collection<Long> ids) {
        return opinionMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<OpinionDO> getOpinionPage(OpinionPageReqVO pageReqVO) {
        return opinionMapper.selectPage(pageReqVO);
    }

    @Override
    public List<OpinionDO> getOpinionList(OpinionExportReqVO exportReqVO) {
        return opinionMapper.selectList(exportReqVO);
    }

}
